Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
11-07-2025

Inwerkingtreding:
11-07-2025

18.1 Balans o.b.v. Grootboek (Prismant)

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: Zorgkantoren 18.1.0
2# Parameters: ?peildatum
3# Ontologie: versie 3.0.0 of nieuwer
4
5PREFIX onz-fin: <http://purl.org/ozo/onz-fin#>
6prefix onz-zorg:  <http://purl.org/ozo/onz-zorg#>
7PREFIX onz-g: <http://purl.org/ozo/onz-g#>
8PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
9
10SELECT
11    ?jaarrekeningpost
12    (SUM(?bedrag_rubriek) AS ?bedrag)
13WHERE
14{
15    BIND(?peildatum AS ?peildatum_argument)
16    {
17        {
18            SELECT  # totaal per rubriek
19                (SUM(?geld_bedrag) + SUM(?saldo_waarde)/count(?saldo_waarde) AS ?bedrag_rubriek) ?rubriek ?categorie
20            WHERE {
21                {
22                    SELECT  # bereken het meest recente saldo per rubriek, 0 indien geen saldo
23                        ?rubriek ?categorie
24                        (IF(BOUND(?saldo_bedrag), ?saldo_bedrag, 0) AS ?saldo_waarde)
25                        ?peildatum_argument
26                        (IF(BOUND(?saldo_datum), ?saldo_datum, ?unbound) AS ?begin_datum)
27                        ?saldo_datum ?saldo
28                    WHERE {
29                        # BIND("2024-12-31"^^xsd:date AS ?peildatum)
30                        BIND(?peildatum as ?peildatum_argument)
31                        # Dynamically identify rubrieken and assign categories
32                        # This assumes ?rubriek instances are findable as subjects/objects in the graph
33                        # and their IRIs start with onz-fin: followed by a 6-digit code.
34                        # For performance, we select ?rubriek instances based on their specific type.
35                        {
36                            SELECT DISTINCT ?rubriek WHERE {
37                                ?rubriek a onz-fin:Grootboekrubriek .
38
39                                # These filters can be kept as a safeguard, but the type-based selection
40                                # is doing the primary work of finding the correct rubrieken.
41                                FILTER(STRSTARTS(STR(?rubriek), STR(onz-fin:)))
42                                FILTER(REGEX(STRAFTER(STR(?rubriek), STR(onz-fin:)), "^[0-9]{6}$"))
43                            }
44                        }
45                        # Re-BIND rubriekCode here as it's outside the subquery's scope for BIND
46                        BIND(STRAFTER(STR(?rubriek), STR(onz-fin:)) AS ?rubriekCode)
47
48                        # Assign category based on the ?rubriekCode pattern
49                        BIND(
50                            COALESCE(
51                                # Rubrieken A.I t/m A.III
52                                IF(STRSTARTS(?rubriekCode, "00"), "A.I", ?unbound),
53                                IF(STRSTARTS(?rubriekCode, "01"), "A.II", ?unbound),
54                                IF(STRSTARTS(?rubriekCode, "03"), "A.III", ?unbound),
55
56                                # Rubrieken B.I t/m B.IV
57                                IF(STRSTARTS(?rubriekCode, "3"), "B.I", ?unbound),
58                                IF(STRSTARTS(?rubriekCode, "12"), "B.II", ?unbound),
59                                IF(STRSTARTS(?rubriekCode, "131"), "B.III", ?unbound),
60                                IF(STRSTARTS(?rubriekCode, "132"), "B.IV", ?unbound),
61
62                                # Rubrieken D.I t/m D.VIII (D.II en D.III bestaan niet in prismant, altijd 0)
63                                IF(STRSTARTS(?rubriekCode, "0511"), "D.I", ?unbound),
64                                IF(STRSTARTS(?rubriekCode, "05413"), "D.IV", ?unbound),
65                                IF(STRSTARTS(?rubriekCode, "05311") || STRSTARTS(?rubriekCode, "05342") || STRSTARTS(?rubriekCode, "05423"), "D.V", ?unbound),
66                                IF(STRSTARTS(?rubriekCode, "05323"), "D.VI", ?unbound),
67                                IF(STRSTARTS(?rubriekCode, "0539") || STRSTARTS(?rubriekCode, "05493") || STRSTARTS(?rubriekCode, "05915"), "D.VII", ?unbound),
68                                IF(STRSTARTS(?rubriekCode, "091"), "D.VIII", ?unbound),
69
70                                # Rubriek E
71                                IF(STRSTARTS(?rubriekCode, "06"), "E", ?unbound),
72
73                                # Rubriek F
74                                IF(STRSTARTS(?rubriekCode, "07"), "F", ?unbound),
75                                
76                                # Rubriek G
77                                IF(STRSTARTS(?rubriekCode, "14") || STRSTARTS(?rubriekCode, "15"), "G", ?unbound),
78                                "other"
79                            ) AS ?categorie
80                        )
81                        # Only process rubrieken that fall into one of the defined categories
82                        FILTER(BOUND(?categorie))
83
84                        OPTIONAL {
85                            ?rubriek onz-g:isAbout ?saldo .
86                            ?saldo
87                                a onz-fin:EindSaldo ;
88                                onz-fin:heeftGeldBedrag ?saldo_bedrag ;
89                                onz-g:hasDate ?saldo_datum .
90                            FILTER (?saldo_datum <= ?peildatum_argument)
91                        }
92                        FILTER NOT EXISTS {
93                            ?rubriek onz-g:isAbout ?saldo2 .
94                            ?saldo2
95                                onz-g:hasDate ?saldo_datum2 ;
96                                a onz-fin:EindSaldo ;.
97                            FILTER(?saldo2 != ?saldo)
98                            FILTER (?saldo_datum2 <= ?peildatum_argument && ?saldo_datum2 > ?saldo_datum)
99                        }
100                    } # End of innermost WHERE
101                } # End of innermost SELECT block
102                OPTIONAL {  # sommige rubrieken hebben misschien geen post
103                ?grootboek_post
104                    a onz-fin:Grootboekpost ;
105                    onz-g:partOf ?rubriek ;
106                    onz-g:hasDate ?datum ;
107                    onz-fin:heeftGeldBedrag ?geld_bedrag_temp .
108                FILTER (?datum <= ?peildatum_argument && (?datum > ?begin_datum || !BOUND(?begin_datum)))
109                }
110                BIND(IF(BOUND(?geld_bedrag_temp), ?geld_bedrag_temp, 0) AS ?geld_bedrag)
111
112            } GROUP BY ?rubriek ?categorie
113        } # End of middle SELECT block
114
115    VALUES (?categorie ?jaarrekeningpost_child){
116        ("A.I"    "A.I Immateriële vaste activa")
117        ("A.II"   "A.II Materiële vaste activa")
118        ("A.III"  "A.III Financiële vaste activa")
119        ("B.I"    "B.I Voorraden")
120        ("B.II"   "B.II Vorderingen")
121        ("B.III"  "B.III Effecten")
122        ("B.IV"   "B.IV Liquide middelen")
123        ("D.I"    "D.I Gestort en opgevraagd kapitaal")
124        ("D.IV"   "D.IV Wettelijke en statutaire reserve")
125        ("D.V"    "D.V Bestemmingsreserve")
126        ("D.VI"   "D.VI Bestemmingsfonds")
127        ("D.VII"  "D.VII Overige reserves")
128        ("D.VIII" "D.VIII Onverdeelde winst")
129        ("E"      "E Voorzieningen")
130        ("F"      "F Langlopende schulden")
131        ("G"      "G Kortlopende schulden")
132    }
133
134    # Determine the parent-level post (A, B, D...) based on the first letter
135    BIND(
136        IF(STRSTARTS(?categorie, "A."), "A Vaste activa",
137        IF(STRSTARTS(?categorie, "B."), "B Vlottende activa",
138        IF(STRSTARTS(?categorie, "D."), "D Eigen vermogen",
139        ?unbound))) AS ?jrp_parent # Fallback naar ?unbound om dubbeltelling te voorkomen
140    )
141
142    BIND(
143        IF(STRSTARTS(?categorie, "A.") || STRSTARTS(?categorie, "B."), "C Totaal activa",
144        IF(STRSTARTS(?categorie, "D.") || ?categorie = "E" || ?categorie = "F" || ?categorie = "G", "H Totaal passiva",
145        ?unbound)) AS ?combi
146    )
147
148    VALUES ?x {1 2 3}
149    BIND(
150        IF(?x = 1, ?jaarrekeningpost_child,
151        IF(?x = 2, ?jrp_parent,
152        IF(?x = 3, ?combi, 
153        ?unbound))) AS ?jaarrekeningpost
154    )
155
156    FILTER(BOUND(?jaarrekeningpost))
157
158    }
159    UNION
160    {
161    # =======================================================================  
162    # Volledige lijst van alle jaarrekeningposten (bedrag 0 als fallback)
163    # =======================================================================
164    BIND(0 AS ?bedrag_rubriek)
165    VALUES (?jaarrekeningpost_child ?jrp_parent ?combi) {
166        # A: Vaste activa
167        ("A.I Immateriële vaste activa"    "A Vaste activa"    "C Totaal activa")
168        ("A.II Materiële vaste activa"     "A Vaste activa"    "C Totaal activa")
169        ("A.III Financiële vaste activa"   "A Vaste activa"    "C Totaal activa")
170        
171        # B: Vlottende activa  
172        ("B.I Voorraden"                   "B Vlottende activa"  "C Totaal activa")
173        ("B.II Vorderingen"                "B Vlottende activa"  "C Totaal activa")
174        ("B.III Effecten"                  "B Vlottende activa"  "C Totaal activa")
175        ("B.IV Liquide middelen"           "B Vlottende activa"  "C Totaal activa")
176        
177        # D: Eigen vermogen
178        ("D.I Gestort en opgevraagd kapitaal"  "D Eigen vermogen"  "H Totaal passiva")
179        ("D.II Agio"                           "D Eigen vermogen"  "H Totaal passiva")
180        ("D.III Herwaarderingsreserve"         "D Eigen vermogen"  "H Totaal passiva")
181        ("D.IV Wettelijke en statutaire reserve" "D Eigen vermogen"  "H Totaal passiva")
182        ("D.V Bestemmingsreserve"              "D Eigen vermogen"  "H Totaal passiva")
183        ("D.VI Bestemmingsfonds"               "D Eigen vermogen"  "H Totaal passiva")
184        ("D.VII Overige reserves"              "D Eigen vermogen"  "H Totaal passiva")
185        ("D.VIII Onverdeelde winst"            "D Eigen vermogen"  "H Totaal passiva")
186        
187        # E, F, G: Overige passiva
188        ("E Voorzieningen"                  "E Voorzieningen"   "H Totaal passiva")
189        ("F Langlopende schulden"           "F Langlopende schulden"  "H Totaal passiva")
190        ("G Kortlopende schulden"           "G Kortlopende schulden"  "H Totaal passiva")
191    }
192
193    VALUES ?post_type { 1 2 3 } # 1=child, 2=parent, 3=combi
194    BIND(
195        IF(?post_type = 1, ?jaarrekeningpost_child,
196        IF(?post_type = 2, ?jrp_parent,
197        IF(?post_type = 3, ?combi, ?unbound))) AS ?jaarrekeningpost
198    )
199    FILTER(BOUND(?jaarrekeningpost))
200    }
201} GROUP BY ?jaarrekeningpost
202ORDER BY ?jaarrekeningpost